# 格式化业绩
import json, requests, re
import sys
#数据库查询
import time

import pymysql
from datetime import datetime, timedelta
from zentao.settings import PYMYSQL_CONF, ROOT_FOLDER
import base64
from decimal import Decimal
import json_repair
from bid.ai_generate.get_project import get_project
from django.db.models import Q, Case, When, IntegerField
from bid.generate.tools.dawate import main_stream
from bid.generate.models import ExBid, ExBidProject, ExBidPmProject, ExProject, ExFile

#大瓦特回复
def dawate_streaming(content,config_params):

    # config_params = {
    #     'relAppId': '17987690',
    #     'appId': '17987868',
    #     'appSecret': '5570ea83260dbcad482a7c9175411d5e',
    #     # 'messages': [{"role": "user", "content": ''.join(["你是谁"]*5000)}]
    #     'messages': [{"role": "user", "content": content}]
    #     # 'messages': ls
    # }

    config_params['messages'] = [{"role": "user", "content": content}]

    answer = ''
    response_content = main_stream(config_params)
    try:
        while True:
            a = next(response_content)
            answer += a
            print(a,end='')
    except StopIteration:
            pass

    #回答去除think部分
    answer = answer.split('</think>')[-1]

        # global_thread['其他'].append([extra['1'],answer])

    return answer

#按相似程度排序
def calculate_similarity(item, tt, bt, tk):
    # techType相似度，因为techType是字符串，直接判断是否在筛选条件中
    tt_similarity = 1 if item['techType'] in tt else 0
    # 计算businessType相似度
    bt_similarity = len(set(item['businessType'].split(',')).intersection(bt))
    # 计算techKeywords相似度
    tk_similarity = len(set(item['techKeywords'].split(',')).intersection(tk))

    return (tt_similarity, bt_similarity, tk_similarity,item['contractAmount'])

def projectFilter(text, bid_id, company,config_params, pm_id=0):

    # text = '''
    # 项目名称：标包4：客户服务平台（南方区域统一电力交易平台V2.1市场管理、现货结算等优化）建设项目
    # 业绩要求：投标人2021年至投标截止日具有咨询评审或信息化技术服务相关业绩，须提供合同（首页、服务内 容页、盖章签字页扫描件）和验收报告、论文、专 利、获奖等任意一种验收证明材料
    # 业绩评分标准：按照近年(2021年至今)完成的同类项目业绩金额进行计分：每三百万2分，最高得10分。 注：提供合同（首页、服务内容页、盖章签字页扫描件）和验收报告、论文、专利、获奖等任意一种验收证明材料，否则相关业绩不得分。
    # 帮我筛选肖建毅的业绩
    # '''
    prompt_1 ='''
    提示词：
    根据传入的标的名称、标包名称、业绩要求以及业绩评分标准，进行关键信息提取，其中关键词需要精简，
    
    ###第一步###
    先使用专用资格要求和评审标准内容提取业务、技术类型
    ###第二步###
    当业务、技术类型提取为空时再使用标包名称提取对应的内容
    ###第三步###
    当业务、技术类型提取依旧为空时再使用标的名称提取对应的内容
    
    ###注意###
    如果没有起始、截止年份要求，则对应字段为空即可
    最高金额和业绩要求个数提取时需要考虑上正偏差和负偏差
    最高金额和业绩要求个数不同时出现，至少一个为"0"，如果无法提取到，也为"0"
    最高金额算法如下：每八百万7分，最高得35分即为800 * (35 / 7) = 4000
    如果是2024年，那么近三年起始时间算法如下：2024-3+1=2022
    
    项目类型分为技术类型和业务类型两种，以下为详细类别和解释
    技术类型：（其中信息化优先级高于集成实施类）
    信息化：一般包含以下字眼：建设、开发及实施
    科技：一般包含以下字眼：研究
    运维：一般包含以下字眼：运维
    咨询：一般包含以下字眼：咨询
    集成实施：一般包含以下字眼：集成实施
    
    业务类型：
    营销域：一般包含以下字眼：营销、客户服务、95598
    计财域：一般包含以下字眼：财务、金融、计财
    党建域：一般包含以下字眼：党建
    综合域：一般包含以下字眼：协同办公、OA、工会系统
    人资域：一般包含以下字眼：人资系统、培训系统、培评
    法规域：一般包含以下字眼：法规、风控、风险评估、法律
    审计域：一般包含以下字眼：审计
    期刊域：一般包含以下字眼：新闻、出版
    资产域：一般包含以下字眼：资产
    
    以下为输入输出示例：
    ###输入###
    今年年份：2025
    项目名称：广东电网有限责任公司电网管理平台(业财协同-计财域、人资域、营销域)建设项目
    专用资格要求：投标人近五年具有信息化项目建设 类业绩（须包含开发实施相关业绩），须提供合同 （首页、服务内容页、盖章签字页扫描件）和验收 报告、论文、专利、获奖等任意一种验收证明材料。
    评审标准：按照近五年完成的同类项目业绩金额进 行计分：每八百万7分，最高得35分。 注：提供合同（首页、服务内容页、盖章签字页扫 描件）和验收报告、论文、专利、获奖等任意一种 验收证明材料，否则相关业绩不得分
    ###输出###
    ```json
    {
    "业务类型": ["计财域", "人资域", "营销域"],
    "技术类型": ["信息化"],
    "最高金额": "4000",
    "业绩要求个数": "0",
    "起始年份": "2021",
    "截止年份": "2025",
    "关键词": ["电网管理平台", "业财协同系统", "企业级平台"]
    }
    ```
    '''

    query = f'###提示词###\n{prompt_1}\n###输入内容要求###\n{text}'
    with open('ceshi.txt', 'a+') as f:
        f.writelines(query)
    answer = dawate_streaming(query,config_params)

    #获取返回的json
    pattern = r"```json(.*?)```"
    matches = re.findall(pattern, answer, re.DOTALL)
    if len(matches) != 0:
        llm_data = json_repair.loads(matches[-1])
    else:
        return

    #没有抽取到信息，直接返回
    if len(llm_data['业务类型'] + llm_data['技术类型']) == 0:
        return

    #获取与或条件
    # or_sql = []
    # and_sql = []
    or_query = Q()
    query = Q()
    #起始结束日期
    start_date = None
    end_date = (datetime.now() + timedelta(hours=8)).date()
    for key in llm_data.keys():
        if key == '业务类型':
            if len(llm_data[key]) != 0:
                or_query = Q()
                for i in llm_data[key]:
                    or_query |= Q(businessType__contains=i)
                query &= or_query
        elif key == '技术类型':
            if len(llm_data[key]) != 0:
                or_query = Q()
                for i in llm_data[key]:
                    or_query |= Q(techType__contains=i)
                query &= or_query
        elif key == '起始年份':
            if llm_data[key].isdigit():
                # 计算当月1号00:00:00的时间
                start_date = datetime(int(llm_data[key]), 1, 1)
        elif key == '截止年份':
            if llm_data[key].isdigit():
                end_date = datetime(int(llm_data[key]), 1, 1)
        elif key == "业绩具体要求":
            # "业绩要求关键字": ["开发", "实施"],
            if llm_data[key]:
                or_query = Q()
                for i in llm_data[key]:
                    or_query |= Q(name__contains=i)
                query &= or_query

    #有开始时间才需要筛选时间
    if start_date:
        query &= Q(contractSignDate__range=(start_date, end_date))  # 当月操作日期

    #如果有项目负责人,则需要筛选项目负责人
    if pm_id != 0:
        query &= Q(PM__id=pm_id)
        # query &= Q(PM='xiaojianyi')

    #筛选公司
    query &= Q(company=company)

    #组合查询条件
    query &= or_query

    #查询数据
    projects = ExProject.objects.filter(query).values('id','name','techType','businessType','techKeywords',
                                                      'contractSignDate','contractAmount').distinct()

    # if not projects and pm_id !=0:
    #     print('\n-----------------------------没有负责人业绩\n')

    projects = [project for project in projects]
    # 根据相似度排序
    sorted_data = sorted(projects, key=lambda x: calculate_similarity(x, llm_data['技术类型'], llm_data['业务类型'], llm_data['关键词']), reverse=True)

    ids = []
    amount = Decimal('0.0')
    #优先使用业绩要求个数
    if "业绩要求个数" in llm_data.keys() and llm_data['业绩要求个数'].isdigit() and int(llm_data['业绩要求个数']) != 0:
        for item in sorted_data:
            ids.append(item['id'])
            if len(ids) == int(llm_data['业绩要求个数']):
                break
    elif "最高金额" in llm_data.keys() and llm_data['最高金额'].replace('.','').isdigit() and int(llm_data['最高金额']) != 0:
        for item in sorted_data:
            ids.append(item['id'])
            amount += Decimal(item['contractAmount'])
            if amount >= Decimal(llm_data['最高金额']):
                break
    else:
        for item in sorted_data:
            ids.append(item['id'])
        # print(
        #     f"{item}, \nSimilarity: {calculate_similarity(item, llm_data['技术类型'], llm_data['业务类型'], llm_data['关键词'])}\t"
        #     f"{llm_data['技术类型'], llm_data['业务类型'], llm_data['关键词']}\n==============================")
    if len(ids) == 0:
        return

    # 创建一个Case表达式用于排序
    preserved_order = Case(
        *[When(id=id, then=pos) for pos, id in enumerate(ids)],
        output_field=IntegerField()
    )

    #查询数据
    projects = ExProject.objects.filter(query).distinct().order_by(preserved_order)

    #获取投标任务对象
    bid = ExBid.objects.filter(id=bid_id).first()

    #存储到数据表中
    for project in projects:
        if pm_id != 0:
            # 添加到数据库
            ExBidPmProject.objects.create(
                bid=bid,
                project=project
            )
        else:
            # 添加到数据库
            ExBidProject.objects.create(
                bid=bid,
                project=project
            )

    # 生成文件
    if pm_id != 0:
        filename, save_path = get_project('pmProject', ids, bid_id)
    else:
        filename, save_path = get_project('project', ids, bid_id)

    # print(save_path)
    return save_path

    # 返回下载链接
    # download_url = f"/api/bid/get_file?path={url_bs64_encode(save_path)}"
    # yield f'{task_id}\t{conversation_id}\t\n下载链接：<a href="{download_url}">{filename}</a>'

    # return llm_data['负责人'], ids

